package com.plian.system.service.zcgl;

import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
import com.plian.system.dto.zcgl.ZcglStaffManagementDTO;
import com.plian.system.entity.zcgl.ZcglStaffManagement;
import com.plian.system.excel.ImportResult;
import com.plian.system.model.ListResult;
import com.plian.system.model.R;
import com.plian.system.mybatis.base.BaseService;
import com.plian.system.mybatis.support.Query;
import com.plian.system.vo.pm.property.ProStaffInfoVO;
import com.plian.system.vo.report.ReportReturnVO;
import com.plian.system.vo.zcgl.ZcglStaffManagementVO;

import javax.servlet.http.HttpServletResponse;
import java.io.File;
import java.io.InputStream;
import java.io.OutputStream;
import java.util.List;
import java.util.concurrent.Future;

public interface IZcglStaffManagementService extends BaseService<ZcglStaffManagement> {
    /**
     * 一个单位下编码是否重复
     *
     * @param code          编码
     * @param companyNameId 单位id
     * @return boolean
     */
    String checkIsExisted(Long id, String code, String companyNameId);

    /**
     * 校验身份证是否重复
     *
     * @param id
     * @param companyNameId
     * @param documentNumber
     * @return
     */
    boolean checkDocumentNumber(Long id, String companyNameId, String documentNumber);

    /**
     * 变更
     * @param staffFilesVO 对象
     * @return
     */
//	Boolean change(StaffFilesVO staffFilesVO);

    /**
     * 员工档案/董事会/监事会/企业领导/后备干部/企业人才 统计表
     *
     * @param staffFilesDTO
     * @return
     */
    ReportReturnVO report(ZcglStaffManagementDTO staffFilesDTO);

    /**
     * 获取员工档案 性别统计数据
     *
     * @param companyNameId 单位
     * @return
     */
    ReportReturnVO reportChartsGender(Long companyNameId);

    /**
     * 获取员工档案 政治面貌统计数据
     *
     * @param companyNameId 单位
     * @return
     */
    ReportReturnVO reportChartsPoliticCountenance(Long companyNameId);

    /**
     * 获取员工档案 最高学历统计数据
     *
     * @param companyNameId 单位
     * @return
     */
    ReportReturnVO reportChartsEducational(Long companyNameId);

    /**
     * 获取员工档案 参加工作时间统计数据
     *
     * @param companyNameId 单位
     * @return
     */
    ReportReturnVO reportChartsWorkTime(Long companyNameId);

    /**
     * 根据id获取 身份证 然后根据身份证获取所有人员id
     *
     * @param id
     * @return
     */
    List<Long> getByStaffId(Long id);

    /**
     * 获取员工档案 给员工档案增加子表信息
     *
     * @param staffFilesVO 员工档案对象
     * @return
     */
    R<ZcglStaffManagementVO> getDetailObj(ZcglStaffManagementVO staffFilesVO);

    /**
     * 获取统计obj
     *
     * @param reportReturnVO
     * @return
     */
    R<ReportReturnVO> getReportObj(ReportReturnVO reportReturnVO);

    /**
     * 获取员工档案 给员工档案增加子表信息
     *
     * @param staffFilesVO 员工档案对象
     * @return
     */
    ZcglStaffManagementVO setChild(ZcglStaffManagementVO staffFilesVO);

    /**
     * 获取员工档案 保存 新增/修改时的档案子表信息
     *
     * @param staffFilesVO 员工档案对象
     * @return
     */
    Boolean saveChild(ZcglStaffManagementVO staffFilesVO);

    /**
     * 校验数据是否有修改 包含子表
     *
     * @param staffFilesVO
     * @return
     */
    Boolean isSame(ZcglStaffManagementVO staffFilesVO, ZcglStaffManagementVO old);

    /**
     * 根据id打印
     *
     * @param id 主键
     * @return File
     */
    File buildpdf(Long id);

    /**
     * 根据id打印
     *
     * @param id 主键
     * @return File
     */
    File createReceptFile(Long id);

    /**
     * 根据DEF1获取员工(导入使用)
     */
    ZcglStaffManagement searchStaffByExcelCode(String excelCode);

    /**
     * 员工档案导入
     *
     * @param progressId  进度标识符
     * @param inputStream Excel
     * @return ImportResult
     */
    Future<ImportResult> importExcel(String progressId, InputStream inputStream, Boolean isCover);

    /**
     * 根据编号获取员工
     *
     * @param staffCode 编号
     * @return
     */
    ZcglStaffManagement searchStaffByStaffCode(String staffCode);

    /**
     * 用于 获取下游单据获取上游单据列表
     *
     * @param query
     * @param queryWrapper
     * @return
     */
    ListResult<ZcglStaffManagementVO> getPreList(Query query, QueryWrapper queryWrapper);

    /**
     * 导入模板下载
     *
     * @param response
     * @param os
     */
    void exportTemplateExcel(HttpServletResponse response, OutputStream os);

    /**
     * 禁用
     *
     * @param ids
     * @return
     */
    boolean disable(List<Long> ids);

    /**
     * 启用
     *
     * @param ids
     * @return
     */
    boolean enable(List<Long> ids);

    /**
     * 根据部门获取人员  企业负责人特殊处理
     *
     * @param deptId
     * @return
     */
    List<ZcglStaffManagement> getByDept(String deptId);

    /**
     * 生成可以导入的excel文件 并返回文件名  时间戳+"-"+uuid
     *
     * @return
     */
    String exportImportFile();

    /**
     * excel文件下载
     *
     * @param key
     * @param response
     */
    void download(String key, HttpServletResponse response);

    /**
     * 根据id获取
     *
     * @param id
     * @return
     */
    ZcglStaffManagementVO getDetailVO(Object id);

    /**
     * 和上月相比 职务是否有变动
     *
     * @param id
     * @param month
     * @return
     */
    Integer getIsChange(Long id, String month);

    List<ZcglStaffManagementVO> setVO(List<ZcglStaffManagement> staffFilesList);

    /**
     * 对身份证进行加密
     *
     * @param staffFilesVO
     */
    void encryptBase64Data(ZcglStaffManagementVO staffFilesVO);

    /**
     * 查询员工档案信息和补充信息
     *
     * @param list
     * @return
     */
    List<ZcglStaffManagementVO> getBaseInfoByCompanyId(List<ZcglStaffManagement> list);


    /**
     * submit
     *
     * @param staffFilesVO
     * @return
     */
    R submit(ZcglStaffManagementVO staffFilesVO);

    /**
     * @Description:  产权查询页面-人员信息
     * @Author: Take-off
     * @Date: 10:57 AM 2023/5/23
     * @Param: [proId]
     * @return: com.plian.system.vo.pm.property.ProStaffInfoVO
     **/
    ProStaffInfoVO staffInfo(String proId);
}
